home *** CD-ROM | disk | FTP | other *** search
/ MacWorld: Complete Mac Interactive / Macworld Complete Mac Interactive CD)(1994).iso / The Best of BMUG / Entertainment / Strategy / Bolo / Bolo Utilities / BoloBrains / Terminator Brain / Brain.h next >
Text File  |  1993-05-26  |  6KB  |  191 lines

  1. #define local static
  2. #define export
  3. #define import extern
  4.  
  5. typedef unsigned char  u_char;
  6. typedef unsigned short u_short;
  7. typedef unsigned long  u_long;
  8.  
  9. typedef u_char  NIBBLE;    // to be interpreted as four bits
  10. typedef u_char  BYTE;
  11. typedef u_short WORD;
  12. typedef struct { u_char c[36]; } u_char36;
  13.  
  14. typedef BYTE MAP_X,   MAP_Y;
  15. typedef WORD WORLD_X, WORLD_Y;
  16.  
  17. // The various accessible tank control functions
  18. enum
  19.     {
  20.     KEY_faster=0, KEY_slower, KEY_turnleft, KEY_turnright,
  21.     KEY_morerange, KEY_lessrange, KEY_shoot, KEY_dropmine,
  22.     KEY_TankView, KEY_PillView
  23.     };
  24. #define setkey(CONTROLVECTOR, COMMAND) CONTROLVECTOR |= (1<<COMMAND)
  25. #define testkey(CONTROLVECTOR, COMMAND) ((CONTROLVECTOR & (1<<COMMAND)) != 0)
  26.  
  27. typedef BYTE TERRAIN;
  28. enum
  29.     {
  30.     BUILDING=0, RIVER, SWAMP, CRATER, ROAD, FOREST, RUBBLE, GRASS,
  31.     HALFBUILDING, BOAT, DEEPSEA, REFBASE_T, PILLBOX_T,
  32.     NUM_TERRAINS,
  33.     TERRAIN_MASK = 0xF,
  34.     TERRAIN_MINE = 0x80
  35.     };
  36.  
  37. #define is_wet(A) ((A) == RIVER || (A) == BOAT || (A) == DEEPSEA)
  38.  
  39. typedef BYTE BUILDMODE;
  40. enum
  41.     {
  42.     BUILDMODE_FARM=1, BUILDMODE_ROAD,
  43.     BUILDMODE_BUILD, BUILDMODE_PBOX, BUILDMODE_MINE
  44.     };
  45.  
  46. typedef struct
  47.     {
  48.     MAP_X x;
  49.     MAP_Y y;
  50.     BUILDMODE action;
  51.     } BuildInfo;
  52.  
  53. // Farming gets you 4 tree units.
  54. // Roads, bridges and buildings take 2 units, boats take 20
  55. // Placing a pillbox takes 4 units, repairing takes proportionately less
  56.  
  57. #define NEUTRAL_PLAYER 0xFF
  58. // player id used to identify neutral bases and pillboxes
  59. #define FORESTVISUAL 0x30
  60. #define MINRANGE 2
  61. #define MAXRANGE 14        // In HALF map-squares
  62. #define MAX_PILL_ARMOUR 15
  63. #define MAX_BASE_SHELLS 90
  64. #define MAX_BASE_MINES  90
  65. #define MAX_BASE_ARMOUR 90
  66. #define ARMOUR_COST 5
  67. #define BASE_RESIST_SHELLS (ARMOUR_COST)
  68. #define BASE_RESIST_TANKS (ARMOUR_COST*2)
  69. #define MIN_BASE_ARMOUR (BASE_RESIST_TANKS + ARMOUR_COST - 1)
  70. // A base bust have one armour unit or more to resist a shell --
  71. // otherwise it is 'transparent' to shells.
  72. // It must have two armour units to or more resist a tank.
  73. // This is so that, after shooting a base down to 'transparency',
  74. // there is some reasonble time window in which to drive onto it.
  75.  
  76. typedef u_long PlayerBitMap;
  77.  
  78. typedef u_short OBJECT;
  79. enum
  80.     {
  81.     OBJECT_TANK=0,
  82.     OBJECT_SHOT,
  83.     OBJECT_PILLBOX,
  84.     OBJECT_REFBASE,
  85.     OBJECT_BUILDMAN
  86.     };
  87.  
  88. #define OBJECT_HOSTILE 1    // Object is hostile to us
  89. #define OBJECT_NEUTRAL 2    // Object is not loyal to any other player
  90.  
  91. typedef struct
  92.     {
  93.     OBJECT object;
  94.     WORLD_X x;
  95.     WORLD_Y y;
  96.     WORD idnum;
  97.     BYTE direction;
  98.     BYTE info;
  99.     } ObjectInfo;
  100.  
  101. typedef struct
  102.     {
  103.     u_short sender;
  104.     PlayerBitMap *receivers;
  105.     u_char *message;
  106.     } MessageInfo;
  107.  
  108. // This header files describes Bolo BrainInfo structure version 2
  109. #define CURRENT_BRAININFO_VERSION 2
  110.  
  111. enum { BRAIN_OPEN=0, BRAIN_CLOSE, BRAIN_THINK, BRAIN_MENU=200 };
  112.  
  113. typedef struct
  114.     {
  115.     u_short BoloVersion;    // two hex bytes, eg. 0x0098 means version 0.98
  116.     u_short InfoVersion;    // current version of the BrainInfo structure is 1
  117.     void   *userdata;        // Initially points to address of your CODE resource
  118.     u_short PrefsVRefNum;
  119.     u_char *PrefsFileName;
  120.     u_short operation;        // 0=OPEN, 1=CLOSE, 2=THINK, 200+ menu
  121.     u_short menu_item;
  122.  
  123.     // Interface providing information about the Bolo world
  124.     
  125.     u_short max_players;    // Players are numbered from 0 to max_players-1
  126.     u_short max_pillboxes;    // Pillboxes are numbered from 0 to max_pillboxes-1
  127.     u_short max_refbases;    // Bases are numbered from 0 to max_refbases-1
  128.     u_short player_number;    // Who Am I?
  129.     u_short num_players;    // How many players currently active in this game?
  130.     u_char36 **playernames;    // Array of pointers to pascal strings
  131.     PlayerBitMap *allies;    // Who you are currently allied to
  132.  
  133.     WORLD_X tankx;
  134.     WORLD_Y tanky;
  135.     
  136.     BYTE direction;
  137.     BYTE speed;                // 64 is top speed on road
  138.     BYTE inboat;            // non-zero means currently on boat
  139.     BYTE hidden;            // non-zero means hidden inside forest
  140.  
  141.     BYTE shells;            // Range 0-40
  142.     BYTE mines;                // Range 0-40
  143.     BYTE armour;            // Range 0-8
  144.     BYTE trees;                // Range 0-40
  145.  
  146.     BYTE carriedpills;        // Number of pillboxes the tank is carrying
  147.     BYTE carriedbases;        // Number of refuelling bases (zero in current versions)
  148.     WORD padding2;
  149.  
  150.     BYTE gunrange;            // in units of half map squares
  151.     BYTE reload;            // non-zero means cannot fire shell immediately
  152.     BYTE newtank;            // Set initially, and each time tank is killed
  153.     BYTE tankobstructed;    // Set if tank has hit obstacle
  154.     
  155.     ObjectInfo *base;        // will be NULL if no friendly base nearby
  156.     BYTE base_shells;
  157.     BYTE base_mines;
  158.     BYTE base_armour;
  159.     BYTE padding3;            // unused at present
  160.  
  161.     BYTE man_status;        // 0 = in tank, 1 = dead, other = outside
  162.     BYTE man_direction;
  163.     WORLD_X man_x;
  164.     WORLD_Y man_y;
  165.     BYTE manobstructed;        // 0 = free, 1 = touching wall, 2 = completely stuck
  166.     BYTE padding4;            // unused at present
  167.  
  168.     WORD *pillview;            // top bit set (0x8000) means view is from tank
  169.     MAP_Y view_top;            // coordinate of topmost square of current view
  170.     MAP_X view_left;        // coordinate of leftmost square of current view
  171.     BYTE  view_height;        // height of the view, in map squares
  172.     BYTE  view_width;        // width of the view, in map squares
  173.     TERRAIN *viewdata;        // view_width*view_height bytes of terrain data
  174.  
  175.     WORD padding5;            // unused at present
  176.     u_short num_objects;    // number of moving objects visible
  177.     ObjectInfo *objects;    // array information about those objects
  178.  
  179.     MessageInfo *message;    // Set if you recevied a message
  180.  
  181.     // Interface to control the tank
  182.     u_long *holdkeys;
  183.     u_long *tapkeys;
  184.     BuildInfo *build;
  185.     PlayerBitMap *wantallies;// Who you want to be allied to
  186.     PlayerBitMap *messagedest;
  187.     u_char *sendmessage;
  188.     } BrainInfo;
  189.  
  190. typedef pascal short BoloBrain(const BrainInfo *braininfo);
  191.